package com.ld.poetry.controller;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.ld.poetry.aop.LoginCheck;
import com.ld.poetry.aop.SaveCheck;
import com.ld.poetry.config.PoetryResult;
import com.ld.poetry.constants.CommonConst;
import com.ld.poetry.dao.TreeHoleMapper;
import com.ld.poetry.entity.TreeHole;
import com.ld.poetry.utils.PoetryUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Random;

/**
 * <p>
 * 弹幕 前端控制器
 * </p>
 *
 * @author sara
 * @since 2021-09-14
 */
@RestController
@RequestMapping("/webInfo")
public class TreeHoleController {

    @Autowired
    private TreeHoleMapper treeHoleMapper;

    /**
     * 保存树洞留言
     * 
     * 功能说明：
     * 1. 保存用户提交的树洞留言
     * 2. 自动生成随机头像（如果未提供）
     * 3. 支持内容校验
     * 
     * 请求参数：
     * @param treeHole 树洞实体
     * - message: 留言内容（必填）
     * - avatar: 用户头像URL（选填）
     * 
     * 返回结果：
     * @return PoetryResult<TreeHole> 操作结果
     * - 成功：返回保存后的树洞实体（包含自动生成的随机头像）
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 校验留言内容是否为空
     * 2. 保存树洞记录
     * 3. 如果未提供头像，生成随机头像
     * 4. 返回保存结果
     * 
     * 注意事项：
     * 1. 需要内容安全检查（@SaveCheck）
     * 2. 留言内容不能为空
     * 3. 头像URL可选，不提供则自动生成
     * 4. 创建时间自动填充
     */
    @PostMapping("/saveTreeHole")
    @SaveCheck
    public PoetryResult<TreeHole> saveTreeHole(@RequestBody TreeHole treeHole) {
        // 校验留言内容是否为空
        if (!StringUtils.hasText(treeHole.getMessage())) {
            return PoetryResult.fail("留言不能为空！");
        }

        // 保存树洞记录到数据库
        treeHoleMapper.insert(treeHole);

        // 如果用户未提供头像，则生成随机头像
        if (!StringUtils.hasText(treeHole.getAvatar())) {
            // 使用null作为种子生成随机头像
            treeHole.setAvatar(PoetryUtil.getRandomAvatar(null));
        }

        // 返回保存成功的树洞实体
        return PoetryResult.success(treeHole);
    }


    /**
     * 删除树洞留言
     * 
     * 功能说明：
     * 1. 根据ID删除指定的树洞留言
     * 2. 需要管理员权限
     * 3. 支持单个留言删除
     * 
     * 请求参数：
     * @param id 树洞ID（必填）
     * - 类型：Integer
     * - 说明：要删除的树洞留言的唯一标识符
     * 
     * 返回结果：
     * @return PoetryResult 操作结果
     * - 成功：返回成功信息
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 接收树洞ID参数
     * 2. 调用数据访问层删除记录
     * 3. 返回操作结果
     * 
     * 注意事项：
     * 1. 需要管理员权限（@LoginCheck(0)）
     * 2. 树洞ID不能为空
     * 3. 删除操作不可恢复
     * 4. 删除前需要确认留言是否被其他功能依赖
     */
    @GetMapping("/deleteTreeHole")
    @LoginCheck(0)
    public PoetryResult deleteTreeHole(@RequestParam("id") Integer id) {
        // 调用数据访问层删除指定ID的树洞记录
        treeHoleMapper.deleteById(id);
        
        // 返回操作成功结果
        return PoetryResult.success();
    }


    /**
     * 查询树洞留言列表
     * 
     * 功能说明：
     * 1. 获取树洞留言列表
     * 2. 支持随机获取指定数量的留言
     * 3. 自动处理用户头像
     * 
     * 请求参数：
     * - 无
     * 
     * 返回结果：
     * @return PoetryResult<List<TreeHole>> 操作结果
     * - 成功：返回树洞留言列表
     * - 失败：返回错误信息
     * 
     * 处理流程：
     * 1. 查询总记录数
     * 2. 根据数量决定查询方式
     * 3. 处理用户头像
     * 4. 返回结果
     * 
     * 注意事项：
     * 1. 当记录数超过限制时，随机获取指定数量的记录
     * 2. 未设置头像的用户会自动生成随机头像
     * 3. 返回的留言数量受 CommonConst.TREE_HOLE_COUNT 限制
     */
    @GetMapping("/listTreeHole")
    public PoetryResult<List<TreeHole>> listTreeHole() {
        // 查询总记录数
        Integer count = new LambdaQueryChainWrapper<>(treeHoleMapper).count();
        
        // 声明树洞列表变量
        List<TreeHole> treeHoles;
        
        // 判断是否需要随机获取记录
        if (count > CommonConst.TREE_HOLE_COUNT) {
            // 计算随机起始位置
            int i = new Random().nextInt(count + 1 - CommonConst.TREE_HOLE_COUNT);
            // 随机获取指定数量的记录
            treeHoles = treeHoleMapper.queryAllByLimit(i, CommonConst.TREE_HOLE_COUNT);
        } else {
            // 获取所有记录
            treeHoles = new LambdaQueryChainWrapper<>(treeHoleMapper).list();
        }

        // 处理用户头像
        treeHoles.forEach(treeHole -> {
            // 如果用户未设置头像，生成随机头像
            if (!StringUtils.hasText(treeHole.getAvatar())) {
                // 使用ID作为种子生成随机头像，确保同一用户头像一致
                treeHole.setAvatar(PoetryUtil.getRandomAvatar(treeHole.getId().toString()));
            }
        });
        
        // 返回处理后的树洞列表
        return PoetryResult.success(treeHoles);
    }
}
